import { defineStore } from 'pinia'

const useUserInfoStore = defineStore('userInfo', {
  // defineStore('userInfo',{})  userInfo就是这个仓库的名称name。这个 name，也称为 id，是必要的，Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use... 是跨可组合项的约定
  state: () => ({
    username: '赫赫',
    age: 30,
    like: 'girl',
    obj: { money: 100, friend: 10 },
    hobby: [
      { id: 1, name: '篮球', level: 1 },
      { id: 2, name: 'rap', level: 10 },
    ],
  }),

  // 类似于计算属性
  getters: {
    // 参数state指向defineStore下的state
    doubleAge(state) {
      return state.age * 2
    },
    //在getter中 使用另一个getter  this指向当前存储库
    addOneAge() {
      return this.doubleAge + 1
    },
    //返回一个函数
    returnFunction(state) {
      return function (id) {
        return state.hobby.find((item) => item.id == id)
      }
    },
  },

  //可以通过this访问整个store实例的所有操作，支持异步操作
  actions: {
    //非异步操作
    addAge(e) {
      console.log('接受的数据', e) //e是外部调用方法传递的参数
      this.age = this.age + e
    },
    // 模拟异步
    asynchronous() {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('模拟异步返回值')
        }, 2000)
      })
    },
    // 异步操作
    async getList() {
      const res = await this.asynchronous()
      return res
    },
  },

  // 持久化配置
  persist: {
    key: 'piniaStore', //存储名称
    storage: sessionStorage, // 存储方式
    paths: ['age', 'like', 'obj'], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态，undefined 或 null 表示持久化整个 state
    // 配置持久化时所使用的序列化方法
    // serializer: {
    //   serialize: JSON.stringify,
    //   deserialize: JSON.parse,
    // },
    // // 将在从storage中恢复数据之前触发
    // beforeRestore: (ctx) => {
    //   console.log('准备从存储中恢复:', ctx.store.$id)
    // },
    // // 将在从storage中恢复数据之后触发
    // afterRestore: (ctx) => {
    //   console.log('已从存储中恢复:', ctx.store.$id)
    // },
    // debug: true, // 开启调试模式
  },
})

export default useUserInfoStore
